#include <list>
#include "node.h"
#include "block.h"

namespace AST {

    // Construtor
    Block::Block(std::list<AST::Node*>* declarations, std::list<AST::Node*>* commands) {
        // Configuração
        this->_setDeclarations(declarations)->_setCommands(commands);
    };

    // Configuração de Declarações de Variáveis
    Block* Block::_setDeclarations(std::list<AST::Node*>* declarations) {
        // Configuração
        this->_declarations = declarations;
        // Encadeamento
        return this;
    };

    // Configuração de Comandos e Instruções
    Block* Block::_setCommands(std::list<AST::Node*>* commands) {
        // Configuração
        this->_commands = commands;
        // Encadeamento
        return this;
    };

    // Captura de Declarações de Variáveis
    std::list<AST::Node*>* Block::getDeclarations() {
        // Apresentação
        return this->_declarations;
    };

    // Captura de Instruções Utilizadas
    std::list<AST::Node*>* Block::getCommands() {
        // Apresentação
        return this->_commands;
    };

    // Sobrescrita
    std::string Block::toString(int indent) {
        // Inicialização
        std::string output = this->getIndentSpaces(indent) + "Block";
        // Declarações
        std::list<Node*> declarations = (*this->getDeclarations());
        for (std::list<Node*>::iterator i = declarations.begin(); i != declarations.end(); i++) {
            output = output + "\n" + (*i)->toString(indent + 1);
        }
        // Comandos
        std::list<Node*> commands = (*this->getCommands());
        for (std::list<Node*>::iterator i = commands.begin(); i != commands.end(); i++) {
            output = output + "\n" + (*i)->toString(indent + 1);
        }
        // Apresentação
        return output;
    };

};

